#pragma once

#include <Ray.hpp>
#include <glm/glm.hpp>

class Camera final {
 public:
  Camera();
  Camera(const glm::vec3& pos, const glm::vec3& target, const glm::vec3& vup,
         float vfov, float aspect_ratio);

  Camera(const glm::vec3& pos, const glm::vec3& target, const glm::vec3& vup,
         float vfov, float aspect_ratio, float aperture, float focus_dist);

  ~Camera() = default;

  Ray GetRay(float u, float v) const;

 private:
  glm::vec3 mOrigin = {};
  glm::vec3 mLowerLeftCorner = {};
  glm::vec3 mHorizontal = {};
  glm::vec3 mVertical = {};
  glm::vec3 mW = {};
  glm::vec3 mU = {};
  glm::vec3 mV = {};
  float mLensRadius = 0.f;
};
